package com.pine.dbant.common.jdbc;


import com.pine.dbant.common.jdbc.core.Record;
import com.pine.dbant.common.jdbc.core.RowMapper;

import java.io.Closeable;
import java.util.List;
import java.util.Map;

/**
 * @author xiaoyuan
 * @create 2022/6/30
 **/
public interface SqlRunner extends Closeable {


    /**
     * 查询一条数据
     *
     * @param sql
     * @param tClass
     * @param params
     * @param <T>
     * @return
     */
    <T> T selectOne(String sql, Class<T> tClass, Object... params);


    /**
     * 查询一条数据
     *
     * @param sql
     * @param params
     * @param <T>
     * @return
     */
    Map<String, Object> selectOne(String sql, Object... params);

    /**
     * 查询集合
     *
     * @param sql
     * @param type
     * @param params
     * @param <T>
     * @return
     */
    <T> List<T> selectList(String sql, Class<T> type, Object... params);

    /**
     * @param sql
     * @param rowMapper
     * @param params
     * @param <T>
     * @return
     */
    <T> List<T> queryList(String sql, RowMapper<T> rowMapper, Object... params);


    /**
     * @param sql
     * @param rowMapper
     * @param params
     * @param <T>
     * @return
     */
    List<Map<String, Object>> queryList(String sql, Object... params);

    /**
     * 查询sql
     * @param sql
     * @param params
     * @return
     */
    Record query(String sql, Object... params);

    /**
     * 执行sql
     *
     * @param sql
     * @param params
     * @return
     */
    default boolean execute(String sql, Object... params) {
        return execute(sql, true, params);
    }

    /**
     * 执行sql
     *
     * @param sql
     * @param autoCommit
     * @param params
     * @return
     */
    boolean execute(String sql, Boolean autoCommit, Object... params);


    /**
     * 设置查询超时时间
     *
     * @param timeout
     */
    void setTimeout(int timeout);

    /**
     * 设置fetchSize参数
     *
     * @param fetchSize
     */
    void setFetchSize(Integer fetchSize);


    /**
     * 开启事务
     */
    void startTransaction();

    /**
     * 提交事务
     */
    void commit();

    /**
     * 回滚事务
     */
    void rollback();

}
